package org.csu.mypetstore.service;

import org.csu.mypetstore.domain.CartItem;
import org.csu.mypetstore.domain.Category;
import org.csu.mypetstore.domain.Item;
import org.csu.mypetstore.domain.Product;
import org.csu.mypetstore.persistence.CategoryMapper;
import org.csu.mypetstore.persistence.ItemMapper;
import org.csu.mypetstore.persistence.ProductMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class CatalogService {
    @Autowired
    private CategoryMapper categoryMapper;
    @Autowired
    private ProductMapper productMapper;
    @Autowired
    private ItemMapper itemMapper;

    public boolean isItemInStock(String itemId) {
        return itemMapper.getInventoryQuantity(itemId) > 0;
    }

    //后台
    //product（item）搜索
    public List<Product> searchProductList(String keywords) {
        return productMapper.searchProductList("%" + keywords.toLowerCase() + "%");
    }

    //category搜索
    public List<Category> searchCategoryList(String keywords){
        return categoryMapper.searchCategoryList("%" + keywords.toLowerCase() + "%");
    }

    //查找所有category，用循环显示头像+name
    //category选择页面、category删除页面
    public List<Category> getCategoryList() {
        return categoryMapper.getCategoryList();
    }

    //查找某category下的所有product，用循环显示头像+name
    //某category下的product选择页面、某category下的product删除页面、category搜索结果跳转页面（指搜出来category后点击了categoryid继续跳转）
    //跳转到该category下的productList后，继续选择一个productId跳转到itemList页面
    public List<Product> getProductListByCategory(String categoryId) {
        return productMapper.getProductListByCategory(categoryId);
    }

    //查找某product下的所有item
    //某product下的item选择页面、某product下的item删除页面、product搜索结果跳转页面（指搜出来product后点击了productid继续跳转）
    public List<Item> getItemListByProduct(String productId) {
        return itemMapper.getItemListByProduct(productId);
    }

    //展示宠物具体信息（itemId、productId、attr1-5、product.name、listPrice、unitCost、supplier）
    public Item getItem(String itemId) {
        Item item=itemMapper.getItem(itemId);
        String productId=item.getProductId();
        Product product=productMapper.getProduct(productId);
        item.setProduct(product);
        return item;
    }

    //修改宠物具体信息（productId、attr1-5、listPrice、unitCost、supplier）
    //listPrice和unitPrice需要用BigDecimal.valueOf()转换一下格式
    public void updateItem(Item item){
        itemMapper.updateItem(item);
    }

    //获取所有productId（方便修改和新增item的时候用下拉框选择productId）
    public List<String> getProductIdList(){
        List<Product> productList = productMapper.getProductList();
        List<String> strings=new ArrayList<>();
        for(int i=0;i<productList.size();i++){
            strings.add(productList.get(i).getProductId());
        }
        return strings;
    }

    //修改category页面（展示信息用）
    public Category getCategory(String categoryId) {
        return categoryMapper.getCategory(categoryId);
    }

    //以下涉及到修改头像的函数，使用时在controller层中一定要注意路径的设置，
    //好好参考我发群里的文件和数据库里的descn格式

    //修改category页面（修改信息用）（修改头像）
    public void updateCategory(Category category){
        categoryMapper.updateCategory(category);
    }

    //修改product页面（展示信息用）
    public Product getProduct(String productId) {
        return productMapper.getProduct(productId);
    }

    //修改product页面（修改信息用）（修改头像）
    //product数据库里的descn是图片资源路径+文字描述
    //前端要分成两个input组件，controller记得把两个String连接起来再product.setDescription()
    public void updateProduct(Product product){
        productMapper.updateProduct(product);
    }

    //获取所有categoryId（方便修改和新增product的时候用下拉框选择categoryId）
    public List<String> getCategoryIdList(){
        List<Category> categoryList=categoryMapper.getCategoryList();
        List<String> strings=new ArrayList<>();
        for(int i=0;i<categoryList.size();i++){
            strings.add(categoryList.get(i).getCategoryId());
        }
        return strings;
    }

    //新增category（修改头像）
    public void insertCategory(Category category){
        categoryMapper.insertCategory(category);
    }

    //新增product（修改头像）
    //product数据库里的descn是图片资源路径+文字描述
    //前端要分成两个input组件，controller记得把两个String连接起来再product.setDescription()
    public void insertProduct(Product product){
        productMapper.insertProduct(product);
    }

    //新增item
    //listPrice和unitPrice需要用BigDecimal.valueOf()转换一下格式
    public void insertItem(Item item){
        itemMapper.insertItem(item);
        itemMapper.insertInventory(item);
    }

    //新增item页面中，后台直接提供一个新的itemId给管理员（itemId是唯一的、不变的、自增的，不可以自定义）
    public String getNewItemId(){
        String lastId=itemMapper.getMaxItemId();
        String head = lastId.substring(0,4);
        String tail = lastId.substring(4,6);
        int num = Integer.valueOf(tail) + 1;
        lastId=head+num;
        return lastId;
    }

    //删除category
    //删除category要先检测一下它底下是否还有product（item），有的话就要先删干净
    public void removeCategory(String categoryId){
        List<Product> productList=getProductListByCategory(categoryId);
        for(int i=0;i<productList.size();i++){
            removeProduct(productList.get(i).getProductId());
        }
        categoryMapper.removeCategory(categoryId);
    }

    //删除product
    //删除product要先检测一下它底下是否还有item，有的话就要先删干净
    public void removeProduct(String productId){
        List<Item> items=getItemListByProduct(productId);
        for(int i=0;i<items.size();i++){
            removeItem(items.get(i).getItemId());
        }
        productMapper.removeProduct(productId);
    }

    //删除item
    public void removeItem(String itemId){
        itemMapper.removeItem(itemId);
        itemMapper.removeInventory(itemId);
    }
}
